/*
题目：
文曲星猜数

操作要求： 
先由计算机随机生成一个各位相异的4位数字，由用户来猜，根据用户猜测的结果给出提示：xAyB。
A前面的数字表示有几位数字不仅数字猜对了，而且位置也正确
B前面的数字表示有几位数字猜对了，但是位置不正确。
最多允许用户猜的次数由用户的键盘输入。如果猜对，则提示“祝贺你猜对了!"；
如果在规定次数以内仍然猜不对，则给出提示"很遗憾,你没有猜对正确的数字!"。
程序结束之前，在屏幕上显示这个正确的数字。

核心思路：
①随机函数rand生成四位数
②降位求余取每一位数
③单循环统计位置正确的数字个数，双循环统计正确的数字个数。 
*/

#include <stdio.h>
#include <stdlib.h>

/*空函数统计猜对的数字*/
void jud(int i,int j){        
	int a[4],b[4],k,t,m=0,n=0;
		a[0]=i%10;           //降位求余，分别取该四位数的每一位 
		a[1]=i/10%10;
		a[2]=i/100%10;
		a[3]=i/1000%10;
		b[0]=j%10;
		b[1]=j/10%10;
		b[2]=j/100%10;
		b[3]=j/1000%10;
		for(k=0;k<4;k++)     //单循环实现对应位的数逐个比较 
			if(a[k]==b[k])
				m++;
		for(k=0;k<4;k++)     //双循环实现每一位的数逐个比较 
			for(t=0;t<4;t++)
				if(a[k]==b[t])
					n++;
	printf("%dA %dB\n",m,n);
}

int fun(){                   //整型函数生成所需数字 
	int a,b,c,d,i;
	do{                            //do while循环实现逐位取，并判断是否符合生成条件 
		i=rand()%8999+1000;        //控制随机函数rand的范围生成一个四位数 
		a=i%10;
		b=i/10%10;
		c=i/100%10;
		d=i/1000%10;
	}while((a==b)||(a==c)||(a==d)||(b==c)||(b==d)||(c==d));    //判断是否符合生成条件(各位相异) 
	return i;
}

int main(){
	int i,j,n,m,k;
	i=fun();
	printf("请输入猜测次数：\n");
	scanf("%d",&n);
	getchar();
	for(m=0;m<n;m++){          //for循环模拟逐次猜测过程 
		printf("请输入猜测数字：\n");
		scanf("%d",&j);
		getchar();         //获取回车键，避免循环不能正常运行 
		jud(i,j);
		if(j==i)           //判断猜测结果是否正确，若猜测正确则提前终止循环 
			break;
	}
	if(j==i)               //判断猜测结果是否正确，输出对应语句 
		printf("祝贺你猜对了!\n");
	else
		printf("很遗憾,你没有猜对正确的数字!\n");
	printf("正确答案是：%d",i);
	return 0;
}